const express = require('express');
const cors = require('cors');
const path = require('path');
const fs = require('fs').promises;
const expressWs = require('express-ws'); // 添加express-ws
require('dotenv').config();

// 导入路由
const userRoutes = require('./routes/userRoutes');
const materialRoutes = require('./routes/materialRoutes');
const progressRoutes = require('./routes/progressRoutes'); // 添加WebSocket路由
const uploadRoutes = require('./routes/uploadRoutes'); // 添加图片上传路由
const cartRoutes = require('./routes/cartRoutes'); // 添加购物车路由
const paymentRoutes = require('./routes/payment'); // 添加支付路由
const systemConfigRoutes = require('./routes/systemConfigRoutes'); // 添加系统配置路由
const materialOrderRoutes = require('./routes/materialOrderRoutes'); // 添加材料订单路由

// 导入数据库配置
const { initializeModels } = require('./models/mongo');

// 创建Express应用
const app = express();

// 初始化WebSocket
expressWs(app); // 启用WebSocket支持

// 中间件配置
app.use(cors()); // 启用CORS
app.use(express.json()); // 解析JSON请求体
app.use(express.urlencoded({ extended: true })); // 解析URL编码的请求体

// 静态文件服务
app.use('/uploads', express.static(path.join(__dirname, 'uploads')));

// 确保上传目录存在
const uploadDir = path.join(__dirname, 'uploads/materials');
fs.mkdir(uploadDir, { recursive: true })
  .then(() => console.log('上传目录已创建:', uploadDir))
  .catch(err => console.error('创建上传目录失败:', err));

// API路由
app.use('/api/users', userRoutes);
app.use('/api/materials', materialRoutes);
app.use('/api', progressRoutes); // 注册WebSocket路由
app.use('/api', uploadRoutes); // 图片上传路由
app.use('/api/admin', require('./routes/adminRoutes')); // 管理后台路由
app.use('/api/cart', cartRoutes); // 购物车路由
app.use('/api/payment', paymentRoutes); // 支付路由
app.use('/api/system-config', systemConfigRoutes); // 系统配置路由
app.use('/api/material-orders', materialOrderRoutes); // 材料订单路由

// 错误处理中间件
app.use((err, req, res, next) => {
  console.error('错误:', err);
  res.status(err.status || 500).json({
    success: false,
    message: err.message || '服务器错误'
  });
});

// 处理未找到的路由
app.use((req, res) => {
  res.status(404).json({
    success: false,
    message: '未找到请求的资源'
  });
});

// 启动服务器
const PORT = process.env.PORT || 5000;
const startServer = async () => {
  try {
    // 初始化数据库模型
    console.log('正在初始化数据库模型...');
    let initialized = await initializeModels(false); // 先尝试不强制重建
    
    if (!initialized) {
      console.log('普通模式初始化失败，尝试强制重建表...');
      initialized = await initializeModels(true);
      
      if (!initialized) {
        throw new Error('数据库初始化失败，即使强制重建表也无法完成');
      }
    }
    
    console.log('数据库初始化成功');
    
    // 启动服务器
    app.listen(PORT, () => {
      console.log(`服务器运行在 http://localhost:${PORT}`);
    });
  } catch (error) {
    console.error('启动服务器失败:', error);
    console.error(error.stack);
    process.exit(1);
  }
};

// 导出app用于测试
module.exports = { app, startServer };

// 如果直接运行此文件，则启动服务器
if (require.main === module) {
  startServer();
}